package xjay.ai.emotionalsupport.agent;

import jakarta.annotation.Resource;
import lombok.Data;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
import xjay.ai.emotionalsupport.chatmemory.ChatHistoryService;
import xjay.ai.emotionalsupport.rag.RagService;

import java.util.ArrayList;
import java.util.List;

@Data
public abstract class BaseAgent {

    //agent属性
    private String agentName;

    //agent状态
    private AgentStatus status = AgentStatus.IDLE;

    //系统提示词管理
    private String systemPrompt; //角色人设

    private String instructionPrompt; //ReAct & CoT 指导提示词

    private String finalPrompt; //最后输出，控制语气


    //agentLoop的执行步骤数控制
    private int currentStep = 0;
    private int maxStep = 10;

    //ChatMemoryRepository进行持久化存储
    private ChatHistoryService chatHistoryService;
    private List<Message> dialogOnlyList = new ArrayList<>(); //只关心对话部分

    //Memory：自主维护与agent聊天的全局上下文记忆包含ReAct的完整思考过程（不是消息队列；消息队列一般有消息生产者和消息消费者的区别）
    private List<Message> messageList = new ArrayList<>();


    //RAG服务
    private RagService ragService;

    /**
     *
     * @param userMessage 用户提示词
     * @return result 不是对话内容，而是Agent内部执行步骤的结果记录，是ReAct框架中observation阶段的输出内容。
     */
    public String run(String userMessage) {
         // 重置Agent状态，确保每一轮都会进入ReAct循环
        setStatus(AgentStatus.IDLE);
        setCurrentStep(0);
        //1.记录消息上下文
        messageList.add(new UserMessage(userMessage));
        //2.定义一次agentLoop的string结果列表
        List<String> results = new ArrayList<>();

        //3.important:执行agentLoop循环，核心在于调用ReActAgent的step函数
        for(int i = 0; i < maxStep && status != AgentStatus.FINISHED; i++) {

            String result = step();
            currentStep = i + 1;
            result = "step" + currentStep + ": " + result;
            results.add(result);

            //输出当前每一步的结果到SSE
            //sseEmitter.send(result);

            //结束条件（或提前结束）
            if(currentStep >= maxStep) {
                status = AgentStatus.FINISHED;
                results.add("Terminated: Reached max steps (" + maxStep + ")");
                //sseEmitter.send("执行结束：达到最大步骤（" + maxSteps + "）");
            }
        }

        //记忆化
        return String.join(",", results);
    }

    /**
     *
     * @return 一次reasoning + act + observation的结果
     */
    protected abstract String step();

    /**
     * 清理资源
     */
    protected void cleanup() {
        // 子类可以重写此方法来清理资源
    }


}
